package com.nku.mason.masonframework.util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public final class ProxyUtil {
	
	private ProxyUtil(){
		//私有构造器，防止外部实例化
	}
	
	/**
	 * 动态代理工具，实例化一个DynamicProxy对象，new DynamicProxy(被代理的对象)，
	 * 之后调用getProxy方法获取代理对象；调用invoke方法完成代理调用
	 * @author Mason
	 * @date 2017年3月16日
	 */
	static class DynamicProxy implements InvocationHandler {
		
		private Object target;
		
		public DynamicProxy(Object obj) {
			this.target = obj;
		}
		
		@SuppressWarnings("unchecked")
		public <T> T getProxy(){
			return (T) Proxy.newProxyInstance(
					target.getClass().getClassLoader(),
					target.getClass().getInterfaces(), 
					this);
		}
		
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			before();
			Object result = method.invoke(target, args);
			after();
			return result;
		}
		
		private void before(){
			//前置通知方法
		}
		
		private void after(){
			//后置通知方法
		}
	}
	
	/**
	 * CGlib动态代理，可以代理一个没有任何接口的类
	 * cglib提供了方法级别的代理，也可以理解为对方法的拦截
	 * @author Mason
	 * @date 2017年3月16日
	 */
	static class CGLibProxy implements MethodInterceptor {
		
		@SuppressWarnings("unchecked")
		public <T> T getProxy(Class<T> cls){
			return (T) Enhancer.create(cls, this);
		}

		@Override
		public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
			before();
			Object result = method.invoke(obj, args);
			after();
			return result;
		}	
		
		private void before(){
			//前置通知方法
		}
		
		private void after(){
			//后置通知方法
		}
	}
}


























































